package top.infopub.mgr.flow.service.impl;


import com.google.common.collect.Maps;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import top.infopub.generic.GenericDao;
import top.infopub.generic.GenericServiceImpl;
import top.infopub.mgr.flow.dao.TemplateDao;
import top.infopub.mgr.flow.dao.TemplateNodeDao;
import top.infopub.mgr.flow.service.TemplateNodeService;
import top.infopub.model.flow.Template;
import top.infopub.model.flow.TemplateNode;

import java.util.List;
import java.util.Map;


@Service
public class TemplateNodeServiceImpl extends GenericServiceImpl<TemplateNode, String> implements TemplateNodeService {

    @Autowired
    private TemplateNodeDao templateNodeDao;

    @Autowired
    private TemplateDao templateDao;

    @Override
    public GenericDao<TemplateNode, String> getDao() {
        return templateNodeDao;
    }

    @Override
    public List<TemplateNode> queryRestAllNodes(String templateId, Integer nowIdx) {
        Map<String, Object> map = Maps.newHashMap();
        map.put("templateId", templateId);
        map.put("nowIdx", nowIdx);
        return templateNodeDao.queryRestAllNodes(map);
    }

    @Override
    public List<TemplateNode> queryRestNodes(String templateId, Integer nowIdx) {
        Map<String, Object> map = Maps.newHashMap();
        map.put("templateId", templateId);
        map.put("nowIdx", nowIdx);
        return templateNodeDao.queryRestNodes(map);
    }

    @Override
    public List<TemplateNode> queryRestNotifyNodes(String templateId, Integer nowIdx) {
        Map<String, Object> map = Maps.newHashMap();
        map.put("templateId", templateId);
        map.put("nowIdx", nowIdx);
        return templateNodeDao.queryRestNotifyNodes(map);
    }

    @Override
    public List<TemplateNode> queryIdxsNotifyNodes(String templateId, Integer idxs) {
        Map<String, Object> map = Maps.newHashMap();
        map.put("templateId", templateId);
        map.put("idxs", idxs);
        return templateNodeDao.queryIdxsNotifyNodes(map);
    }

    @Override
    @Transactional(rollbackFor = Exception.class)
    public void insertByBatch(String templateId, String sname, String srcBizTable,
                              String branchCode, String isEdit, String memo,
                              List<TemplateNode> templateNodes) {
        Template template = new Template();
        template.setId(templateId);
        template.setSname(sname);
        template.setSrcBizTable(srcBizTable);
        template.setIsEdit(isEdit);
        template.setMemo(memo);
        template.setBranchCode(branchCode);
        templateDao.updateByIdSelective(template);

        templateNodeDao.deleteByTemplateId(templateId);

        templateNodeDao.insertByBatch(templateNodes);
    }

    @Override
    public TemplateNode queryNextIdxsNodes(String templateId, Integer nodeIdx) {
        return templateNodeDao.queryNextIdxsNodes(templateId, nodeIdx);
    }

    @Override
    public List<TemplateNode> queryAllByTemplateId(String templateId) {
        return templateNodeDao.queryAllByTemplateId(templateId);
    }
}